package Day_0201.JUC;

/**
 * @author zxc
 * @date 2023/02/01 15:45
 **/
public class Wait_notify {
    public static void main(String[] args) {
        /**
         * 为什么wait和notify方法要在同步代码块中使用？（try-catch-finally）
         *
         * 1. 只有在调用线程拥有某个对象的独占锁时，才能够调用该对象的wait(),notify()和notifyAll()方法。
         * ===>
         * （1）wait()方法 ：强制当前线程释放对象锁。
         *  这意味着在调用某对象的wait()方法之前，当前线程必须已经获得该对象的锁。
         *  因此，线程必须在某个对象的同步方法或同步代码块中才能调用该对象的wait()方法。
         *
         * （2）在调用对象的notify()和notifyAll()方法之前，调用线程必须已经得到该对象的锁。
         *  因此，必须在某个对象的同步方法或同步代码块中才能调用该对象的notify()或notifyAll()方法。
         *
         * （3）调用wait()方法的原因通常是，调用线程希望某个特殊的状态(或变量)被设置之后再继续执行。
         *  调用notify()或notifyAll()方法的原因通常是，调用线程希望告诉其他等待中的线程:"特殊状态已经被设置"。
         *  这个状态作为线程间通信的通道，它必须是一个可变的共享状态(或变量)。
         *
         * 2. 如果你不这么做，你的代码会抛出IllegalMonitorStateException异常。
         *
         * 3. 还有一个原因是为了避免wait和notify之间产生竞态条件。
         *
         */
    }
}
